package com.platform.server.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import java.util.SortedMap;
import java.util.TreeMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.platform.server.response.response.pojo.ReturnData;

import net.sf.json.JSONObject;

public class WxpayDemoUtils{
	
	private static final Logger logger = LoggerFactory.getLogger(WxpayDemoUtils.class);
	
	// 微信支付参数
	public static ReturnData wxPay(String body, String out_trade_no, String total_amount, String loca_ip,String param,Integer type)throws Exception {
		ReturnData returnData = new ReturnData("");
		/*logger.info("---" + body + "\t out_trade_no=" + out_trade_no + "\t total_fee=" + total_fee + "\t order_id=" + type);*/

		// 随机字符串
		String nonce_str = getRandomString(32);
		// 封装参数
		//金额
		Double d = Double.parseDouble(total_amount) * 100;
		String string = d.toString();
		string = string.substring(0, string.length() - 2);
		SortedMap<String, String> signParams = new TreeMap<String, String>();
		signParams.put("appid", WeixinCons.WX_APP_ID); // 微信开放平台审核通过的应用APPID
		signParams.put("mch_id", WeixinCons.WX_MACH_ID); // 微信支付分配的商户号
		signParams.put("nonce_str", nonce_str); // 随机字符串，不长于32位
		signParams.put("body", body); // 商品描述
		signParams.put("attach", param); // 附加数据，在查询API和支付通知中原样返回
		signParams.put("out_trade_no", out_trade_no); // 商户系统内部订单号
		signParams.put("total_fee", string); // 订单总金额，单位为分
		signParams.put("spbill_create_ip", loca_ip); // 用户端实际ip
		if(type==1){ //开通会员
			signParams.put("notify_url", WeixinCons.WX_PAY_NOTIFY_URL);// 接收微信支付异步通知回调地址
		}else if(type==2){ //余额充值
			signParams.put("notify_url", WeixinCons.WX_BALANCE_NOTIFY_URL);// 接收微信支付异步通知回调地址
		}else if(type == 3){
			//购买课程回调地址
			signParams.put("notify_url", WeixinCons.WX_PAY_COURSE_URL);// 接收微信支付异步通知回调地址
		}/*else if(type == 3){
			//购买系列课程回调地址
			signParams.put("notify_url", WeixinCons.WX_PAY_SYSTEM_COURSE_URL);// 接收微信支付异步通知回调地址
		}*/
		signParams.put("trade_type", "APP"); // 支付类型
		/*if(temp==2){			
		}else if(temp==21){
			signParams.put("product_id",out_trade_no);
			signParams.put("trade_type", "NATIVE"); // 支付类型
		}*/
		String sign = WeixinPayUtil.createSign("UTF-8",signParams);// 生成签名
		signParams.put("sign", sign); // 签名
		String requestXml = WeixinPayUtil.getRequestXml(signParams);// 生成Xml格式的字符串
		/*logger.info("----------------requestXML-------------------\n" + requestXml);*/
		// 调用统一支付接口
		// requestXml = new String(requestXml.getBytes("utf-8"), "ISO-8859-1");
		String resXml = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXml);
		// System.out.println("******************微信支付返回*******************\n" +
		// resXml);

		// 返回的result成功结果取出prepay_id：
		Map map = XMLUtil.doXMLParse(resXml);
		String return_code = (String) map.get("return_code");
		// System.out.println(JSONObject.fromObject(map).toString());
		// System.out.println(return_code);
		if (return_code.contains("SUCCESS")) {
			String prepay_id = (String) map.get("prepay_id"); // 获取到prepay_id
			String signs = (String) map.get("sign"); // 获取到prepay_id
			JSONObject jso = new JSONObject();
			String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
			jso.put("appid", WeixinCons.WX_APP_ID); // app_id
			jso.put("partnerid", WeixinCons.WX_MACH_ID); // 微信商户账号
			jso.put("prepayid", prepay_id); // 预付订单id
			jso.put("package", "Sign=WXPay"); // 默认sign=WXPay 
			jso.put("noncestr", nonce_str); // 自定义不重复的长度不长于32位
			jso.put("timestamp", timestamp); // 北京时间时间戳
			jso.put("sign", signs);

			SortedMap<String, String> signParam = new TreeMap<String, String>();
			signParam.put("appid", WeixinCons.WX_APP_ID); // app_id
			signParam.put("partnerid", WeixinCons.WX_MACH_ID); // 微信商户账号
			signParam.put("prepayid", prepay_id); // 预付订单id
			signParam.put("package", "Sign=WXPay"); // 默认sign=WXPay
			signParam.put("noncestr", nonce_str); // 自定义不重复的长度不长于32位
			signParam.put("timestamp", timestamp); // 北京时间时间戳
			String signAgain = WeixinPayUtil.createSign("UTF-8", signParam);// 再次生成签名
			jso.put("sign", signAgain);
			// System.out.println("微信支付：+++++++++++++++++++++++++++++++++++++++++");
			// System.out.println(jso.toString());
			returnData.setData(jso);
		} else {
			returnData.setMsg((String) map.get("return_msg"));
			returnData.setCode(2);
			returnData.setData(false);
		}
		return returnData;
	}
	
	
	// 表示生成字符串的长度
	public static String getRandomString(int length) {
		length -= 14;
		String base = "abcdefghijklmnopqrstuvwxyz0123456789";
		StringBuffer sb = new StringBuffer();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
		sb.append(sdf.format(new Date()));
		Random random = new Random();
		for (int i = 0; i < length; i++) {
			int number = random.nextInt(base.length());
			sb.append(base.charAt(number));
		}
		return sb.toString();
	}
	
	// 微信支付参数-----扫码支付
	public static ReturnData wxPublicPay(String body, String out_trade_no, Integer total_fee, String type, String loca_ip,int temp)throws Exception {
		ReturnData returnData = new ReturnData("");
		// 随机字符串
		String nonce_str = getRandomString(32);
		// 封装参数
		SortedMap<String, String> signParams = new TreeMap<String, String>();
		signParams.put("appid", WeixinCons.public_app_id); 												// 微信开放平台审核通过的应用APPID
		signParams.put("mch_id", WeixinCons.public_mach_id); 											// 微信支付分配的商户号
		signParams.put("nonce_str", nonce_str); 														// 随机字符串，不长于32位
		signParams.put("body", body); 																	// 商品描述
		signParams.put("attach", type); 																// 附加数据，在查询API和支付通知中原样返回
		signParams.put("out_trade_no", out_trade_no); 													// 商户系统内部订单号
		signParams.put("total_fee", String.valueOf(total_fee)); 										// 订单总金额，单位为分
		signParams.put("spbill_create_ip", loca_ip); 													// 用户端实际ip
		if(temp==1){ //开通会员
			signParams.put("notify_url", WeixinCons.WX_PAY_NOTIFY_URL);// 接收微信支付异步通知回调地址
		}else if(temp==2){ //余额充值
			signParams.put("notify_url", WeixinCons.WX_BALANCE_NOTIFY_URL);// 接收微信支付异步通知回调地址
		}else if(temp == 3){
			//购买课程回调地址
			signParams.put("notify_url", WeixinCons.WX_PAY_COURSE_URL);// 接收微信支付异步通知回调地址
		}
		signParams.put("product_id",out_trade_no);
		signParams.put("trade_type", "NATIVE"); 														// 支付类型--扫码支付
					
		String sign = WeixinPayUtil.createSign("UTF-8", signParams, WeixinCons.public_api_key);			// 生成签名
		signParams.put("sign", sign);					 												// 签名
		String requestXml = WeixinPayUtil.getRequestXml(signParams);									// 生成Xml格式的字符串

		// 调用统一支付接口
		// requestXml = new String(requestXml.getBytes("utf-8"), "ISO-8859-1");
		String resXml = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXml);

		// 返回的result成功结果取出prepay_id：
		Map map = XMLUtil.doXMLParse(resXml);
		String return_code = (String) map.get("return_code");
		if (return_code.contains("SUCCESS")) {		
			returnData.setData(map.get("code_url"));
		} else {
			returnData.setMsg((String) map.get("return_msg"));
			returnData.setCode(2);
			returnData.setData(false);
		}
		return returnData;
	}
	
}

